package com.it.schoolbookshop_back.service;

import com.it.schoolbookshop_back.entities.po.Book;

import java.util.List;

/**
 * 收藏服务接口
 */
public interface FavoriteService {
    
    /**
     * 添加收藏
     * 
     * @param userId 用户ID
     * @param bookId 书籍ID
     * @return 添加结果，true表示成功，false表示失败
     * @throws IllegalArgumentException 当书籍不存在或已收藏时抛出
     */
    boolean addFavorite(Integer userId, Integer bookId) throws IllegalArgumentException;
    
    /**
     * 取消收藏
     * 
     * @param userId 用户ID
     * @param bookId 书籍ID
     * @return 取消结果，true表示成功，false表示失败
     * @throws IllegalArgumentException 当书籍未收藏时抛出
     */
    boolean cancelFavorite(Integer userId, Integer bookId) throws IllegalArgumentException;
    
    /**
     * 切换收藏状态
     * 如果用户已收藏该书籍，则取消收藏；如果未收藏，则添加收藏
     * 
     * @param userId 用户ID
     * @param bookId 书籍ID
     * @return 操作结果，包含是否成功以及操作类型（添加或取消）
     * @throws IllegalArgumentException 当书籍不存在时抛出
     */
    FavoriteToggleResult toggleFavorite(Integer userId, Integer bookId) throws IllegalArgumentException;
    
    /**
     * 获取用户收藏的书籍列表
     * 
     * @param userId 用户ID
     * @return 书籍列表
     */
    List<Book> getFavoriteBooks(Integer userId);
    
    /**
     * 获取指定用户对指定书籍的收藏记录ID
     *
     * @param userId 用户ID
     * @param bookId 书籍ID
     * @return 收藏记录ID，如果未收藏则返回null
     */
    Integer getFavoriteId(Integer userId, Integer bookId);
    
    /**
     * 收藏切换结果类
     */
    class FavoriteToggleResult {
        private final boolean success;
        private final boolean isAdded; // true表示添加收藏，false表示取消收藏
        
        public FavoriteToggleResult(boolean success, boolean isAdded) {
            this.success = success;
            this.isAdded = isAdded;
        }
        
        public boolean isSuccess() {
            return success;
        }
        
        public boolean isAdded() {
            return isAdded;
        }
    }
} 